﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CBE.Model;
using Common.DataAccess;
using Microsoft.Data.Extensions;

namespace CBE.DataAccess
{
    public class AdministrarClientesDataAccess : GenericEntityManagerDataAccess<Clientes, AdministrarClientesCriteria, AdministrarClientesView, CBEEntities>
    {
        
        protected override Clientes ReadEntity(Guid id)
        {
            return ObjectContext.Clientes.
                Include("Localidades").
                Include("Provincias").
                Include("TiposDocumentos").
                Where(cliente => cliente.ID_Cliente == id).
                FirstOrDefault();
        }

        public override List<AdministrarClientesView> Read(AdministrarClientesCriteria criteria)
        {
            return ObjectContext.Clientes.
                Include("Localidades").
                Include("Provincias").
                Include("TiposDocumentos").
                Where(cliente => (String.IsNullOrEmpty(criteria.Apellido) || cliente.Apellido.Contains(criteria.Apellido)) &&
                                 (String.IsNullOrEmpty(criteria.Nombre) || cliente.Nombre.Contains(criteria.Nombre))).
                Select(cliente => new AdministrarClientesView
                {
                    ID = cliente.ID_Cliente,
                    Apellido = cliente.Apellido,
                    Nombre = cliente.Nombre
                }).OrderBy(c => c.Apellido).ThenBy(c => c.Nombre).ToList();
        }

        public override List<Clientes> ReadEntities()
        {
            var list = ObjectContext.Clientes.
                Include("Localidades").
                Include("Provincias").
                Include("TiposDocumentos").ToList();
            return list;
        }

        public List<Clientes> ReadTOPXClientesPorImporteVenta(Int32 topX)
        {
            var listOfIDClientes = ObjectContext.CreateStoreCommand("Clientes_ObtenerTOPXPorImporteVentas", System.Data.CommandType.StoredProcedure, new System.Data.SqlClient.SqlParameter("@pTOPX", topX))
                .Materialize<Clientes>(r => new Clientes
                {
                    ID_Cliente = r.Field<Guid>("ID_Cliente"),
                    Mail = r.Field<String>("Mail"),
                });

            return listOfIDClientes.ToList();
        }

    }
}
